%%HP: T(3)A(D)F(.);
DIR
  RASP
    \<<
"ROCKET ALTITUDE SIMULATION"
{ { "MASS:"
"ROCKET MASS (GRAMS)"
0 } { "DIAM:"
"MAX BODY DIAMETER (MILLIMETERS)"
0 } { "ROD:"
"LAUNCH ROD LENGTH (METERS)"
0 } { "Cd:"
"DRAG COEFFICIENT"
0 } { "TMAX:"
"SIMULATION DURATION (SEC)"
0 } { "DT:"
"INTEGRATION STEP (SEC)"
0 } { "IOUT:"
"# OF STEPS/OUTPUT"
0 } } { 2 2 }
M.EMPTY 1000 * R
2000 * L.ROD C.D
TMAX DT IOUT 7
\->LIST DUP INFORM
      IF
      THEN OBJ\->
DROP IP 'IOUT' STO
'DT' STO 'TMAX' STO
'C.D' STO 'L.ROD'
STO 2000 / 'R' STO
1000 / 'M.EMPTY'
STO
        IF
MOTOR.SEL
        THEN
RASP.CALC VIEWSUM
        END
      END
    \>>
  TRAJ \GSDAT
  X.MAX
[ 3.56 .102 -9.81 .0149 55.3 ]
  V.MAX
[ .72 .102 1.67 33.1 13 ]
  A.MAX
[ .2 .106 87.2 8.9 .624 ]
  BURNOUT
[ .76 .102 -16.4 32.5 14.3 ]
  ROD
[ .22 .106 85.3 10.6 .836 ]
  RASP.CALC
    \<< -1 M.EMPTY
M.MOTOR + 0 0 0 0
.5 \Gr * \pi * C.D * R
SQ * \->NUM \-> \<-i \<-m
\<-t \<-a \<-v \<-x drag
      \<< 0
"Calculating...




"
2 DISP drag
SIM.THRUST
"Burnout at t=" \<-t
+ 3 DISP \<-t \<-m \<-a
\<-v \<-x 5 \->ARRY -3
RND 'BURNOUT' STO
drag SIM.COAST
      \>> ROW\-> STO\GS
'\GSDAT' 'TRAJ' STO
    \>>
  SIM.THRUST
    \<< THRUSTCURVE {
1 2 } GET
THRUSTCURVE { 1 1 }
GET DUP2 / 0 1
M.FUEL THRUSTCURVE
DUP SIZE 2 1 PUT
GET DT / IP / 0 0 0
\-> drag thnxt tnxt
dth th0 thidx dm th
v.max a.max
      \<<
        DO
          IF '\<-i'
INCR IOUT MOD NOT
          THEN \<-t
\<-m \<-a \<-v \<-x 5 \->ARRY
-3 RND SWAP 1 +
          END DT
'\<-t' STO+ '\<-m' dm
STO-
          WHILE \<-t
tnxt \>=
          REPEAT
            IF
thnxt
            THEN
thnxt tnxt \-> thp tp
              \<<
'thidx' INCR DROP
THRUSTCURVE { thidx
2 } GET DUP 'thnxt'
STO thp -
THRUSTCURVE { thidx
1 } GET DUP 'tnxt'
STO tp - / DUP
'dth' STO tp * NEG
thp + 'th0' STO
              \>>
            ELSE 0
'th0' STO 0 'dth'
STO MAXR 'tnxt' STO
0 'thnxt' STO
            END
          END \<-t
dth * th0 + DUP
'th' STO \<-v DUP ABS
* drag * - \<-m / G -
DUP '\<-a' STO DT *
\<-v + DUP '\<-v' STO
DT * '\<-x' STO+
          IF \<-x
L.ROD <
          THEN \<-t
\<-m \<-a \<-v \<-x 5 \->ARRY
-3 RND 'ROD' STO
          END
          IF \<-v
v.max >
          THEN \<-v
'v.max' STO \<-t \<-m
\<-a \<-v \<-x 5 \->ARRY -3
RND 'V.MAX' STO
          END
          IF \<-a
a.max >
          THEN \<-a
'a.max' STO \<-t \<-m
\<-a \<-v \<-x 5 \->ARRY -3
RND 'A.MAX' STO
          END
        UNTIL th 0
\<=
        END
      \>>
    \>>
  SIM.COAST
    \<< 0 \-> drag
x.max
      \<<
        WHILE \<-x 0
> \<-t TMAX \<= AND
        REPEAT
          IF '\<-i'
INCR IOUT MOD NOT
          THEN \<-t
\<-m \<-a \<-v \<-x 5 \->ARRY
-3 RND SWAP 1 +
          END DT
'\<-t' STO+ \<-v DUP
ABS * drag * \<-m /
NEG G - DUP DT * \<-v
+
          IF DUP 0
<
          THEN
            IF \<-v 0
\>=
            THEN
"Apogee at t=" \<-t +
4 DISP \<-t \<-m \<-a \<-v
\<-x 5 \->ARRY -3 RND
'X.MAX' STO
            END
          END DUP
DT * '\<-x' STO+ '\<-v'
STO '\<-a' STO
        END
      \>>
    \>>
  MOTOR.SEL
    \<< { MOTORS }
EVAL
"MOTOR MANUFACTURER:"
VARS 1 CHOOSE
      IF
      THEN EVAL
"SELECT A MOTOR:"
VARS 1 CHOOSE
        IF
        THEN RCL
UPDIR UPDIR OBJ\->
DROP 'THRUSTCURVE'
STO 'M.FUEL' STO
'M.MOTOR' STO 1
        ELSE UPDIR
UPDIR 0
        END
      ELSE UPDIR 0
      END
    \>>
  VIEWSUM
    \<< "Burnout:
"
BURNOUT DUP 1 GET
-3 RND "s  " + SWAP
5 GET DUP IP "m  "
+ SWAP .3048 / IP
"ft
" + + + +
"Apogee:
" + X.MAX
DUP 1 GET -3 RND
"s  " + SWAP 5 GET
DUP IP "m  " + SWAP
.3048 / IP "ft
" +
+ "Vmax: " + V.MAX
4 GET DUP -2 RND
"m/s  " + SWAP
.44704 / IP
"mph
Amax: " + +
A.MAX 3 GET DUP -2
RND "m/s^2  " +
SWAP 9.80665 / -2
RND "G
" + + + + +
+ 2 DISP 3 FREEZE
    \>>
  MOTORS
    DIR
      Aerotech
        DIR
          D9 { .045
.0101
[[ .05 14 ]
 [ .2 15 ]
 [ .4 15 ]
 [ .8 14 ]
 [ 1.2 8.2 ]
 [ 1.8 2.2 ]
 [ 2.25 0 ]]
}
          D15 {
.044 .0089
[[ .005 26 ]
 [ .1 28.5 ]
 [ .4 23 ]
 [ .8 11.2 ]
 [ 1 4.5 ]
 [ 1.4 0 ]
 [ 2.25 0 ]]
}
          D21 {
.0236 .0096
[[ .06 26.7 ]
 [ .16 27.81 ]
 [ .36 28.35 ]
 [ .5 23.36 ]
 [ .81 13.35 ]
 [ .87 2.67 ]
 [ .9 2.25 ]
 [ .91 0 ]]
}
          E28 {
.055 .0184
[[ .03 52 ]
 [ 1.012 19 ]
 [ 1.4 0 ]]
}
          F39 {
.059 .0227
[[ .01 60 ]
 [ .2 56.9 ]
 [ .4 46.7 ]
 [ .8 36.9 ]
 [ 1 26.7 ]
 [ 1.1 20.6 ]
 [ 1.2 6.7 ]
 [ 1.4 0 ]]
}
        END
      Estes
        DIR
          A3 {
.0076 .0033
[[ .125 7.9 ]
 [ .181 3.2 ]
 [ .25 2.5 ]
 [ .71 2.15 ]
 [ .73 0 ]]
}
          A10 {
.0076 .0038
[[ .063 5.2 ]
 [ .125 12.4 ]
 [ .2 4.4 ]
 [ .25 1.2 ]
 [ .375 .7 ]
 [ .5 .6 ]
 [ 1.12 .52 ]
 [ 1.13 0 ]]
}
          A8 {
.0162 .0033
[[ .15 8.3 ]
 [ .18 9.6 ]
 [ .2 9.7 ]
 [ .229 8.9 ]
 [ .25 6.2 ]
 [ .314 3.97 ]
 [ .335 3.85 ]
 [ .415 3.75 ]
 [ .45 0 ]]
}
          B6 {
.0178 .0056
[[ .026 .7 ]
 [ .158 9 ]
 [ .211 10.7 ]
 [ .263 7.5 ]
 [ .666 5.2 ]
 [ .75 0 ]]
}
          C6 {
.0222 .0108
[[ .054 2 ]
 [ .107 8 ]
 [ .155 13.3 ]
 [ .181 13.3 ]
 [ .196 10.5 ]
 [ .214 8.5 ]
 [ .25 7.5 ]
 [ .268 6.5 ]
 [ .339 6 ]
 [ .446 5.65 ]
 [ 1.393 5.65 ]
 [ 1.45 0 ]]
}
          D12 {
.0438 .0211
[[ .04 1 ]
 [ .08 3 ]
 [ .12 5 ]
 [ .16 10 ]
 [ .2 15 ]
 [ .24 22.7 ]
 [ .28 22.7 ]
 [ .304 15 ]
 [ .357 13 ]
 [ .5 10.5 ]
 [ 1.5 9.44 ]
 [ 1.55 0 ]]
}
        END
    END
  M.MOTOR .0178
  M.FUEL .0056
  THRUSTCURVE
[[ .026 .7 ]
 [ .158 9 ]
 [ .211 10.7 ]
 [ .263 7.5 ]
 [ .666 5.2 ]
 [ .75 0 ]]
  M.EMPTY .09
  R .021
  L.ROD 1
  C.D .75
  TMAX 12
  DT .02
  IOUT 10
  \Gr 1.20209
  G 9.80665
  \GSPAR { 1 5 0 0
LINFIT }
  PPAR { (0,-71.25)
(12,475) X 0 {
(0,0) { # Ah # Ah }
} SCATTER Y }
  \GSDAT
[[ 3.56 .102 -9.81 .0149 55.3 ]]
END
